#include <my_header.h>

long long current_time_mills()
{
    struct timespec ts;
    // 获取当前时间存入ts结构体
    clock_gettime(CLOCK_REALTIME, &ts);
    // 转换为ns 获取最终秒数需要ms+ns才是完整的时间
    return (long long)ts.tv_sec * 1000000000LL + ts.tv_nsec;
}



/* Usage: ./3_RDWE_toupper filename */
int main(int argc, char *argv[]){                                  
    long t1  = current_time_mills();

    ARGS_CHECK(argc, 2);
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, -1, "open");

    // 读取字符二进制
    char ch;
    while(1)
    {
        ssize_t sret = read(fd, &ch, 1);
        if(sret == 0)
        {
            break;
        }
        // 将字符转换成大写字母，写回文件
        // 此时将不会正常写入
        ch = toupper(ch);
        // 加一个lseek将成功
        // // 将字符转换成大写字母，先左移1位文件指针，
        // 再将字符写回文件
        lseek(fd, -1, SEEK_CUR);
        write(fd, &ch, 1);
    }
    
    // 关闭文件描述符
    close(fd);
     // 复制完成的结束时间
     long t2 = current_time_mills();
     // 打印复制所需要的时间
     printf("time = %ldns\n", (t2-t1));
    return 0;
}

#if 0
在read/write的过程中，始终存在一个内核态缓冲区指针来指
示文件读写的位置，每read一下文件指针就要后移1位(移动
读写元素大小个字节)，每write一下指针同样后移1位。

如果原文件数据是：how are you，那么最终的结果是：
hHwWaAeEyYuU
在read之后，就需要将文件指针向文件的开头移动1位。
需要一个能够移动文件指针位置的函数，这个函
数就是lseek函数。
#endif
